package com.study.funny.grpc;

import com.study.funny.lib.HelloGrpc;
import com.study.funny.lib.HelloWorldProto;
import io.grpc.Channel;
import io.grpc.netty.shaded.io.grpc.netty.NegotiationType;
import io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder;
import net.devh.boot.grpc.client.inject.GrpcClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

/**
 * @ClassName: GrpcClientService
 * @Description:
 * @Author: funny
 * @CreateTime: 2025-01-05 22:45
 * @Version: 1.0
 **/
@Service
public class GrpcClientService {
    @GrpcClient("funny-server")
    private HelloGrpc.HelloBlockingStub helloBlockingStub;

    @Value("${grpc.client.funny-server.port}")
    private Integer port;

    @Value("${grpc.client.funny-server.host}")
    private String host;

    /**
     * 方法一 使用注解的方式实现
     * 本方法通过调用gRPC服务，发送问候消息
     * @param name 用户名，用于个性化问候信息
     * @return 服务返回的问候消息
     */
    public String sendMessageOne(String name) {
        // 创建HelloRequest对象，并设置用户名
        HelloWorldProto.HelloRequest request = HelloWorldProto.HelloRequest.newBuilder().setName(name).build();
        // 调用gRPC服务的sayHello方法，传递请求对象
        HelloWorldProto.HelloReply response = this.helloBlockingStub.sayHello(request);
        // 返回服务响应的结果
        return response.getResult();
    }


    /**
     * 使用gRPC发送消息的函数
     * 本函数通过Netty连接到指定的主机和端口，以明文方式建立连接，不涉及加密
     * 主要目的是通过gRPC服务发送一个问候消息，并接收回复
     *
     * @param name 发送的问候消息中包含的名称
     * @return 从gRPC服务接收到的回复消息
     */
    public String sendMessageTwo(String name) {
        // 创建一个Netty通道，用于与指定地址的gRPC服务进行通信
        Channel channel = NettyChannelBuilder.forAddress(host, port)
                .negotiationType(NegotiationType.PLAINTEXT)
                .build();

        // 创建一个阻塞存根，用于调用gRPC服务的方法
        HelloGrpc.HelloBlockingStub stub = HelloGrpc.newBlockingStub(channel);

        // 使用阻塞存根调用gRPC服务的sayHello方法，发送问候请求并接收回复
        HelloWorldProto.HelloReply response = this.helloBlockingStub.sayHello(HelloWorldProto.HelloRequest.newBuilder().setName(name).build());

        // 返回从gRPC服务接收到的回复消息
        return response.getResult();
    }

}
